package com.algorithm.labuladong.binarytree;

/**
 * @author: tzj
 * @create: 2021-08-11
 **/
public class BinaryTreeOperator {

    static BinaryTree.Node root = new BinaryTree.Node();
    static BinaryTree binTree = new BinaryTree();


    public static void main(String[] args) {
//        System.out.println("--------反转二叉树--------");
//        BinaryTree.Node node = invertTree(root);
//        System.out.println("--------这是一条分隔符--------");
//        binTree.printf(node, 0);

//        System.out.println("--------前序遍历二叉树--------");
//        binTree.preOrder(root);
//        System.out.println("\n");
//        System.out.println("--------中序遍历二叉树--------");
//        binTree.inOrder(root);
//        System.out.println("\n");
//        System.out.println("--------后序遍历二叉树--------");
//        binTree.postOrder(root);
    }


    /**
     * 翻转左右节点
     *
     * @param p
     * @return
     */
    public static BinaryTree.Node invertTree(BinaryTree.Node p) {
        // base case
        if (p == null) {
            return null;
        }

        /**** 前序遍历位置 ****/
        // root节点需要交换它的左右子节点
        BinaryTree.Node temp = p.leftChild;
        p.leftChild = p.rightChild;
        p.rightChild = temp;

        // 让左右子节点继续翻转它们的子节点
        invertTree(p.leftChild);
        invertTree(p.rightChild);

        return p;
    }

    // 初始化二叉树
    static {
        BinaryTree.Node p;
        p = binTree.insertLeftChild(root, 'A');
        p = binTree.insertLeftChild(p, 'B');
        p = binTree.insertLeftChild(p, 'D');
        p = binTree.insertRightChild(p, 'G');
        p = binTree.insertRightChild(root.leftChild, 'C');
        binTree.insertLeftChild(p, 'E');
        binTree.insertRightChild(p, 'F');
        binTree.printf(root, 0);
    }


}
